iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0

StatefulSet Controller 是穩定又有序的, 它會記錄有狀態應用的狀態, 嚴格的控制循環監控Pod的實際狀態與期望狀態是否相同, 發生不相同時會依照本身紀錄的狀態屬性做復原。
由StatefulSet Controller擴展出來的Pod名稱是有序的, 具有唯一網路識別符與持久化儲存裝置, 會有序地擴展, 有序地刪除, 適合應用在需要保持狀態或需要唯一網路識別符的服務。

  • StatefulSet 特性

    • 唯一的網路識別符
    • 持久化儲存
    • 有序地部署和擴展
    • 有序地刪除和終止
    • 有序地滾動更新
  • StatefulSet 組成

    • Headless Service: 用在為Pod的識別符生成可解析的DNS
    • StatefulSet: 管理Pod
    • volumeClaimTemplate: 為Pod提供專用的持久化儲存

StatefulSet Controller 會為每個VolumeClaimTemplate創建一個專用的PV, 透過指定的StorageClass關聯PVC和PV, 未指定的就使用預設StorageClass, 刪除Pod時並不會刪除PV, 所以PV數據可復用。

https://ithelp.ithome.com.tw/upload/images/20200926/20129656PMxzNi8laA.png
StatefulSet 支援動態擴縮容操作, 擴容時會按照順序增加更多的Pod, 刪除時則會反序刪除Pod直到符合期望為止, 擴容或刪除都需要等前一個Pod完成動作才會進行下一個, 所以過程中如果有一個Pod發生錯誤尚未執行完流程時, StatefulSet 也會停下來等錯誤排除才會進行下一個。

創建 StatefulSet

spec 必填字段serviceName, template;spec.selector.matchLabels 必須和 spec.template.metadata.labels相同。

  • 配置YAML[示例]
  apiVersion: v1
  kind: Service
  metadata:
    name: myapp-svc
    labels:
      app: myapp-svc
  spec:
    ports:
    - port: 80
      name: web
    clusterIP: None
    selector:
      app: myapp-pod
  ---
  apiVersion: apps/v1
  kind: StatefulSet
  metadata:
    name: myapp
  spec:
    serviceName: myapp-svc
    replicas: 1
    selector:
      matchLabels:
        app: myapp-pod
    template:
      metadata:
        labels:
          app: myapp-pod
      spec:
        containers:
	      - args:
	        - -c
	        - /nsqd --tcp-address=0.0.0.0:4188 --lookupd-tcp-address=nsqlookupd:4160 --data-path=/data
	          --broadcast-address=$(hostname -f)
	        command:
	        - /bin/sh
          name: myapp
	        image: nsqio/nsq:v1.2.0
	        imagePullPolicy: Always
          ports:
	        - containerPort: 4188
	          name: tcp
	          protocol: TCP
	        - containerPort: 4151
	          name: http
	          protocol: TCP
          volumeMounts:
	        - mountPath: /data
	          name: data
    volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 2Gi
        volumeMode: Filesystem

滾動更新

滾動更新StatefulSet預設的更新方是, 它會以反序的方式從最大的索引編號進行更新, 等更新就續後才會啟動下一個資源(即索引號碼-1), 對於具有主從複製類的cluster來說, 可以確保主節點作用的Pod會是最後一個更新的。

  • 暫存更新
    StatefulSet可以做到暫存更新, 使用情境是在用戶需要更新但又不想馬上更新的時候,可以把更新操作"暫存", 等條件滿足後再手動更新; 配置上只需要將spec.updateStrategy.rollingUpdate.partition 字段的值設定為Pod的副本數量, 其分區編號就會是Pod索引號+1, 表示所有的Pod都不會處於可直接更新的分區內, 之後的更新操作都不會直接執行更新, 會一直等到用戶降低分區編號到現有的Pod索引範圍內。

補充

StatefulSet Controller管理Pod的策略除了OrderedReady(升序創建, 降序刪除), 也支援並行的創建跟刪除, 要完成並行操作只需要將spec.podManagementPolicy 設定為Parallel即可。
Statefulset的刪除方式和其他Pod Controller 一樣, 刪除時預設會把汗StatefulSet相關的Pod資源都刪掉, 如果要只刪除statefulSet本身可加上--cascade=false即可。

今日小結

昨天喝了兩杯, 覺得可以繼續走完剩下的10天了


上一篇
day 19 ConfigMap and Secret
下一篇
day 21 Network and NetworkPolicy
系列文
K8S - 30天從擦槍到提槍上陣學習筆記。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言